AVX2指令集浮点乘法性能分析 | 您所在的位置:网站首页 › Openwrt 指令集 avx › AVX2指令集浮点乘法性能分析 |
AVX2指令集浮点乘法性能分析
一、AVX2指令集介绍二、代码实现0. 数据生成1. 普通连乘2. AVX2指令集乘法:单精度浮点(float)3. AVX2指令集乘法:双精度浮点(double)
三、性能测试测试环境计时方式测试内容进行性能测试第一次测试第二次测试
四、总结个人猜测原因:
一、AVX2指令集介绍
AVX2是SIMD(单指令多数据流)指令集,支持在一个指令周期内同时对256位内存进行操作。包含乘法,加法,位运算等功能。下附Intel官网使用文档。 Intel® Intrinsics Guide 我们本次要用到的指令有 **__m256 _mm256_mul_ps(__m256 a, __m256 b), __m256d_mm256_mul_pd(__m256d a, __m256d b)**等,(p代表精度precision,s代表single,d代表double) 它们可以一次取256位的内存,并按32/64位一个浮点进行乘法运算。下附官网描述。 Synopsis__m256d _mm256_mul_pd (__m256d a, __m256d b) #include Instruction: vmulpd ymm, ymm, ymm CPUID Flags: AVX DescriptionMultiply packed double-precision (64-bit) floating-point elements in a and b, and store the results in dst. Operation FOR j := 0 to 3 i := j*64 dst[i+63:i] := a[i+63:i] * b[i+63:i] ENDFOR dst[MAX:256] := 0 Performance ArchitectureLatencyThroughput (CPI)Icelake40.5Skylake40.5Broadwell30.5Haswell50.5Ivy Bridge51 二、代码实现 0. 数据生成为了比较结果,我们用1+1e-8填充。这里利用模版兼容不同数据类型。由于AVX2指令集一次要操作多个数据,为了防止访存越界,我们将大小扩展到256的整数倍位比特,也就是32字节的整数倍。 uint64_t lowbit(uint64_t x) { return x & (-x); } uint64_t extTo2Power(uint64_t n, int i)//arraysize datasize { while(lowbit(n) T product = 1; for (uint64_t i = 0; i 1}; __m256 product256 = _mm256_setr_ps(1, 1, 1, 1, 1, 1, 1, 1); __m256 load256 = _mm256_setzero_ps(); for (uint64_t i = 0; i double product[4] = {1}; __m256d product256 = _mm256_setr_pd(1, 1, 1, 1); __m256d load256 = _mm256_setzero_pd(); for (uint64_t i = 0; i uint64_t timems = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); return timems; } 测试内容连乘1e8遍,答案是 ( 1 + 1 1 0 8 ) 1 0 8 {(1+\frac{1}{10^8})}^{10^8} (1+1081)108,理论上应该是一个比较接近 e e e的值, 分别测试float和double。 uint64_t N = 1e8; // compare the performance of simpleProduct and avx2Product uint64_t start, end; //compare float cout |
CopyRight 2018-2019 实验室设备网 版权所有 |